package arithmetic;

import org.junit.jupiter.api.Test;

import java.util.Stack;

/**
 * 有效的括号
 *
 * @author gaojie
 * @date 2022-03-02
 */
public class ValidBracket {

    @Test
    void test() {
        assert fun("{}");
        assert fun("{}[]");
        assert fun("()[]{}");
        assert !fun("(]");
        assert !fun("([)]");
    }

    /**
     * 1.字符串转换成字符数组，然后遍历
     * 2.若栈不为空且当前符号和栈顶为一对，则弹出
     * 3.否则都入栈
     * 4.循环结束后，若栈为空，则表示为正确的括号
     */
    private boolean fun(String s) {
        Stack<Character> stack = new Stack<>();
        for (char c : s.toCharArray()) {
            if (!stack.isEmpty() && isMatch(stack.peek(), c)) {
                stack.pop();
            } else {
                stack.push(c);
            }
        }
        return stack.empty();
    }

    /**
     * 比较 2 个符号是否为一对
     */
    private boolean isMatch(char a, char b) {
        switch (a) {
            case '{':
                return b == '}';
            case '(':
                return b == ')';
            case '[':
                return b == ']';
            default:
                return false;
        }
    }

}
